package com.example.behaviorpattern.observer;

import com.example.behaviorpattern.observer.impl.ConcreteObserver;
import com.example.behaviorpattern.observer.impl.ConcreteSubject;
import com.example.behaviorpattern.observer.impl.StringMessage;

/**
 *
 * 观察者模式在JAVA中是一种常用的设计模式，它适合于以下场景：
 * 当一个对象的变化需要同时改变其他对象的时候，而且它不知道具体有多少对象需要变化。
 * 当一个对象必须通知其他对象，而又不需要知道这些对象是谁。
 * 用于实现广播通讯。
 * 使用观察者模式需要以下几个关键组件：
 * Subject（主题）：可以注册观察者、删除观察者或通知观察者的对象。
 * Observer（观察者）：提供一个更新接口，以便在主题的状态改变时得到通知。观察者对象通常实现一个接口，定义了一个update()方法。
 * ConcreteSubject（具体主题）：存储状态，当状态改变时，向Observer发出通知。
 * ConcreteObserver（具体观察者）：实现Observer的更新接口，以便在状态变化时做出反应。
 * @author yaojianfeng
 */
public class ObserverTest {

    public static void main(String[] args) {
        // 创建主题对象
        ConcreteSubject subject = new ConcreteSubject();
        // 创建观察者对象
        MyObserver observer1 = new ConcreteObserver("observer1");
        MyObserver observer2 = new ConcreteObserver("observer2");
        // 注册观察者
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        // 改变主题状态
        subject.setState(new StringMessage("Hello World"));
        // 注销观察者
        subject.removeObserver(observer1);
        // 改变主题状态
        subject.setState(new StringMessage("Goodbye"));
    }
}
